//Inicializando variables
locales
int i=0;
char ord[20];
//Obteniendo m xima resolución
posible
xmax=getmaxx();
ymax=getmaxy();
//Creando ejes de coodernadas
line(20,0,20,ymax-20);//ejes de las x
line(20,ymax-20,xmax,ymax-20); //ejes de las
y
for (i=1;i<=20;i++) //numerando ejes
cartesianos
{
sprintf(ord,"%d",i*3);
outtextxy((i*30)+20,ymax-20,ord); //ejes x
outtextxy(5,ymax-(i*30)-20,ord); //ejes y
outtextxy(xmax-100,30,"Escala
1:10");
};
}
void ejes::cuadricula()
{
int i=0,j=0;
for (i=1;i<=34;i++)
{
line(20,(ymax-20)-(i*10),xmax,(ymax-20)-(i*10));
//filas
};
for (j=1;j<=65;j++)
{
line(20+(j*10),ymax-20,20+(j*10),120);
//columnas
};
}
class parabola
{
public:void graftiro(float ang,float vel);
};
void parabola::graftiro(float ang, float vel)
//ángulo y velocidad
{
//Inicializando variables para el
cálculo
const g=9.8; //gravedad terrestre
double x=0,y=0,t=0,stop=1;
char ord[20];
for (t=1;stop!=0; t++)
{
//formulas para el movimiento
vertical y horizontal
//en funcián del tiempo
respectivamente
y=(vel*sin(ang*M_PI/180)*t/30)-(g*0.5*pow(t/30,2));
//g es la aceleración de la gravedad
x=(vel*cos(ang*M_PI/180)*t/30);
moveto(((x+20)),(ymax-20-y));
putpixel(getx(), gety(), getmaxcolor());
if (t<1000) //esto no puede durar mas de 10
segundos
{ //control de pausa
por si la cosa se alarga
delay(10);
};
if (gety()>=ymax-20)
{
stop=0;
outtextxy(xmax-280,40,"Sumario");
sprintf(ord,"Tiempo %f segundos",t/30);
outtextxy(xmax-280,60,ord);
sprintf(ord,"Distancia %f
metros",vel*cos(ang*M_PI/180)*t/30);
outtextxy(xmax-280,80,ord);
sprintf(ord,"Altura máxima %f
metros",pow(vel*sin(ang*M_PI/180),2)/(2*g));
outtextxy(xmax-280,100,ord);
};
};
}
void main()
{
video objvideo; //instanciando
objetos
ejes objejes;
parabola grafica;
objvideo.inicializar();
cout<<" Simulaci¢n de tiro
parab¢lico"<<"n";
cout<<" Desarrollado por Luis Alberto De
Jesús"<<"n";
cout<<" 19/11/07"<<"n";
cout<<" Digite una opción para
continuar";
char inf,inf1;
gotoxy(2,6);
cout<<"Cuadricular s/n ?"; //por si queremos
cuadricular
inf1=getche();
double a,v;
inicio: //etiqueta de referencia
objejes.dibujar();
if ((inf1=='s')||(inf1=='S')) // si se eligio s
cuadriculamos
{
objejes.cuadricula();
}
outtextxy(30,20,"Digite el ngulo de tiro:
");
gotoxy(30,2);cin>>a;
if ((a<0)||(a>90)) //control del angulo de
tiro
{
cout.width(20);
cout<<"Entrada inv lida";
getche();
goto inicio; //si es menor que 0 o mayor de 90 ir a
inicio
}
outtextxy(30,35,"Digite la velocidad de
tiro en m/seg: ");
gotoxy(42,3);cin>>v;
grafica.graftiro(a,v);//grados y velocidad
outtextxy(30,50,"Desea terminar la simulación
s/n? ");
gotoxy(40,4);
inf=getche();
if ((inf=='s')||(inf=='S')) //por si queremos repetir la
simulación o terminar
{
goto fin;
}
else
{
goto inicio;
}
fin: //etiqueta de referencia
objvideo.finalizar(); //liberando la memoria
}
Veamos ahora el aspecto en pantalla
Presionamos s para ver la simulación en
cuadrícula. Cualquier tecla por si no.
Digitamos un ángulo, por ejemplo 56
Pulsamos intro y digitamos una velocidad inicial, 65 por
ejemplo y pulsamos intro.
Si digitamos s salimos del simulador y si presionamos
cualquier tecla realizamos otra simulación.
Hasta otra próxima monografía.
Luís Alberto De Jesús
Santo Domingo República Dominicana.
23/11/2007
Autor:
dataunix[arroba]hotmail.com
Programa que simula el lanzamiento de un proyectil dado
su ángulo
y velocidad inicial tomando como base las
fórmulas referentes al tiro parabólico
*/
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <iostream.h>
#include <dos.h>
#include <string.h>
double xmax=0, ymax=0;
//variables
globales, obtienen resolución máxima
class video
{
public: void inicializar();
public: void finalizar();
};
void video::inicializar()
{
//solicitando autodetección del driver de
gráficos
int gdriver = DETECT, gmode, errorcode;
//Inicializando driver de gr ficos y variables
locales
initgraph(&gdriver, &gmode,
"c:\tc\bgi");
//no olvidar especificar ruta de las librerias de
gráficos
//verificando errores
errorcode = graphresult();
if (errorcode != grOk) //ocurri¢ un
error?
{
grapherrormsg(errorcode);
cout<<"Error de video:
"<<errorcode;
cout<<"Presionar cualquier tecla: ";
getch();
exit(1); //Termina si hay un error
};
}
void video::finalizar()
{
closegraph(); //proceso de
limpieza
}
class ejes
{
public: void dibujar();
public: void cuadricula();
};
void ejes::dibujar()
{
cleardevice();//limpia la pantalla
setcolor(EGA_YELLOW);
setbkcolor(EGA_BLUE);
Página anterior | Volver al principio del trabajo | Página siguiente |